<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Code de Hamming</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Code_de_Hamming"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Code_de_Hamming rootpage-Code_de_Hamming skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Code de Hamming</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>Un <b>code de Hamming</b> est un <a href="Code_correcteur" title="Code correcteur">code correcteur</a> <a href="Code_lin%C3%A9aire" title="Code linéaire">linéaire</a>. Il permet la détection et la correction automatique d'une erreur si elle ne porte que sur une lettre du message.
</p><p>Un code de Hamming est <a href="Code_parfait" class="mw-redirect" title="Code parfait">parfait</a> : pour une longueur de code donnée il n'existe pas d'autre code plus compact ayant la même capacité de correction. En ce sens son rendement est maximal.
</p><p>Il existe une famille de codes de Hamming ; le plus célèbre et le plus simple après le <a href="Code_de_r%C3%A9p%C3%A9tition" title="Code de répétition">code de répétition</a> binaire de dimension <i>trois</i> et de longueur <i>un</i> est sans doute le code <a href="Syst%C3%A8me_binaire" title="Système binaire">binaire</a> de paramètres <a href="Code_de_Hamming_(7%2C4)" title="Code de Hamming (7,4)">[7,4,3]</a>. Pour chaque alphabet ayant pour nombre de lettres une puissance d'un <a href="Nombre_premier" title="Nombre premier">nombre premier</a> et pour chaque longueur <i>l</i> de code il existe un code de Hamming utilisant cet alphabet et de longueur au moins égal à <i>l</i>.
</p><p>Plusieurs méthodes permettent de construire un code de Hamming. Une approche consiste à rechercher les <a href="Code_cyclique" title="Code cyclique">codes cycliques</a> de <a href="Distance_de_Hamming" title="Distance de Hamming">distance minimale</a> égale à trois, le code apparait alors comme un cas particulier de <a href="Code_BCH" title="Code BCH">code BCH</a>. Il est aussi possible d'utiliser uniquement les outils de l'<a href="Alg%C3%A8bre_lin%C3%A9aire" title="Algèbre linéaire">algèbre linéaire</a> et particulièrement la théorie des <a href="Matrice_(math%C3%A9matiques)" title="Matrice (mathématiques)">matrices</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Histoire">Histoire</h2></div>
<p>Depuis 1946 <a href="Richard_Hamming" title="Richard Hamming">Richard Hamming</a> <small>(1915-1998)</small> travaille sur un modèle de <a href="Calculateur" class="mw-disambig" title="Calculateur">calculateur</a> à <a href="Carte_perfor%C3%A9e" title="Carte perforée">carte perforée</a> de faible fiabilité. Si, durant la semaine, des ingénieurs pouvaient corriger les erreurs, les périodes chômées comme la fin de semaine voient les machines s'arrêter invariablement sur des <a href="Bug_informatique" class="mw-redirect" title="Bug informatique">bugs</a>. La frustration<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> de Hamming le conduit à inventer le premier code correcteur véritablement efficace.
</p><p>Cette période correspond à la naissance de la <a href="Th%C3%A9orie_de_l'information" title="Théorie de l'information">théorie de l'information</a>. <a href="Claude_Shannon" title="Claude Shannon">Claude Shannon</a> <small>(1916, 2001)</small> formalise cette théorie comme une branche des mathématiques<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>. Hamming développe<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> les prémisses de la théorie des codes et décrit sa solution comme un exemple.
</p><p>En 1960, deux mathématiciens R. C. Bose, D. K. Ray-Chaudhuri montrent<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> que des idéaux de l'anneau des polynômes sur les corps finis de <a href="Caract%C3%A9ristique_d'un_anneau" title="Caractéristique d'un anneau">caractéristique</a> deux sont particulièrement adaptés. La théorie est généralisée<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> par le mathématicien A. Hocquenghem et donne naissance à la famille de <a href="Code_BCH" title="Code BCH">codes BCH</a>. Les codes de Hamming binaires apparaissent immédiatement comme des codes BCH.
</p>
<div class="mw-heading mw-heading2"><h2 id="Contexte">Contexte</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Code_correcteur">Code correcteur</h3></div>
<p>L'objectif d'un code correcteur est la détection ou la correction d'erreurs après la transmission d'un <a href="Message" title="Message">message</a>. Cette correction est permise grâce à l'ajout d'informations redondantes. Le message est <a href="Plongement" title="Plongement">plongé</a> dans un ensemble plus grand, la différence de taille contient la redondance, l'image du message par le plongement est transmise. En cas d'altération du message, la redondance est conçue pour détecter ou corriger les erreurs. Un code de Hamming procède de cette logique, la redondance permet exactement la correction d'une altération sur une unique lettre du message.
</p><p>Rappelons les éléments de base de la formalisation. Il existe un ensemble <i>E</i> constitué de <a href="Suite_(math%C3%A9matiques)" title="Suite (mathématiques)">suites</a> de longueur <i>k</i> à valeurs dans un alphabet de taille <i>d</i>, c’est-à-dire qu'à partir du rang <i>k</i>, toutes les valeurs de la suite sont nulles. Ces éléments sont l'espace des messages que l'on souhaite communiquer. Pour munir le message de la redondance souhaitée, il existe une <a href="Application_(math%C3%A9matiques)" title="Application (mathématiques)">application</a> φ <a href="Injection_(math%C3%A9matiques)" title="Injection (mathématiques)">injective</a> de <i>E</i> à valeurs dans <i>F</i>, l'espace des suites de longueur <i>n</i> et à valeurs dans un alphabet. La fonction φ est appelée <i>encodage</i>, φ(<i>E</i>) aussi noté <i>C</i> est appelé le <i>code</i>, un élément de φ(<i>E</i>) <i>mot du code</i>, <i>k</i> la longueur du code et <i>n</i> la dimension du code. Ces notations sont utilisées dans tout l'article.
</p>
<div class="mw-heading mw-heading3"><h3 id="Code_linéaire"><span id="Code_lin.C3.A9aire"></span>Code linéaire</h3></div>
<p>Un <a href="Code_lin%C3%A9aire" title="Code linéaire">code linéaire</a> dispose d'une <a href="Structure_(math%C3%A9matiques)" title="Structure (mathématiques)">structure</a> <a href="Structure_alg%C3%A9brique" title="Structure algébrique">algébrique</a> plus riche que celle du cadre général des codes correcteurs.
</p><p>Les alphabets <i>A</i> et <i>A'</i> sont identifiés et munis d'une structure de <a href="Corps_fini" title="Corps fini">corps fini</a>. Le cas le plus fréquent consiste à choisir le corps <i>F</i><sub>2</sub> ou l'une de ses <a href="Extension_finie" title="Extension finie">extensions finies</a>, on parle alors d'alphabet <a href="Syst%C3%A8me_binaire" title="Système binaire">binaire</a>.
</p><p>Les ensembles <i>E</i> et <i>F</i> sont naturellement munis d'une structure d'<a href="Espace_vectoriel" title="Espace vectoriel">espace vectoriel</a> de dimension respectives <i>k</i> et <i>n</i>. Si <i>F</i><sub>d</sub> désigne le <a href="Corps_fini" title="Corps fini">corps fini</a> de cardinal <i>d</i> où <i>d</i> est une puissance d'un <a href="Nombre_premier" title="Nombre premier">nombre premier</a> <i>p</i>, alors l'<a href="Espace_vectoriel_fini" title="Espace vectoriel fini">espace vectoriel fini</a> <i>F</i> est généralement identifié à <i>F</i><sub>d</sub><sup>n</sup>.
</p><p><i>F</i> est muni d'une <a href="Distance_(math%C3%A9matiques)" title="Distance (mathématiques)">distance</a> qui dérive du <a href="Poids_de_Hamming" class="mw-redirect" title="Poids de Hamming">poids de Hamming</a>. La distance entre deux points de <i>F</i> correspond au nombre de coordonnées non nulles de la différence entre les deux points, dans la <a href="Base_canonique" title="Base canonique">base canonique</a>. Un code se décrit par trois paramètres, noté [<i>n</i>, <i>k</i>, δ], <i>n</i> est la longueur du code, <i>k</i> la dimension du code et δ la distance minimale entre deux mots du code. Enfin, l'application d'encodage φ est choisie <a href="Application_lin%C3%A9aire" title="Application linéaire">linéaire</a>, le code est donc un <a href="Sous-espace_vectoriel" title="Sous-espace vectoriel">sous-espace vectoriel</a>.
</p><p>Un code de Hamming est un code linéaire, dont la distance minimale δ est égale à <i>trois</i>. Ces notations sont utilisées dans le reste de l'article.
</p>
<div class="mw-heading mw-heading3"><h3 id="Code_parfait">Code parfait</h3></div>
<p>Usuellement, on considère que le mot de code émis est celui se trouvant le plus près du mot reçu, ce qui revient à supposer que le minimum de lettres a été modifié. Ce procédé conduit à une erreur de décodage chaque fois que l'erreur est supérieure à la capacité corrective du code. La question naturelle est celle de la valeur de <i>t</i> correspondant au nombre maximum d'erreurs corrigibles.
</p><p>Une interprétation géométrique donne un élément de réponse. Les <a href="Boule_(math%C3%A9matiques)" class="mw-redirect" title="Boule (mathématiques)">boules</a> fermées de rayon <i>t</i> centrées sur les mots de code doivent être disjointes. La capacité de correction d'un code correspond au plus grand entier <i>t</i> vérifiant cette propriété, c'est aussi le plus grand entier strictement plus petit que δ/2, ce qui donne une valeur égale à <i>un</i> dans le cas d'un code de Hamming. Elle permet de définir une première majoration, appelée <i>borne de Hamming</i> :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 1+n.(d-1)\leq d^{n-k}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>1</mn>
<mo>+</mo>
<mi>n</mi>
<mo>.</mo>
<mo stretchy="false">(</mo>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>≤<!-- ≤ --></mo>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 1+n.(d-1)\leq d^{n-k}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/353ca18e5d6894ce09ce1222b8ee96940eef1ef5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:21.13ex; height:3.176ex;" alt="{\displaystyle 1+n.(d-1)\leq d^{n-k}}" loading="lazy"></span></center>
<p>Il existe une configuration idéale, correspondant au cas où les boules fermées de rayon <i>un</i> et de centre les mots du code forment une <a href="Partition_(math%C3%A9matiques)" class="mw-redirect" title="Partition (mathématiques)">partition</a> de l'espace <i>F</i>. Si la transmission ne produit jamais plus d'une altération, alors l'erreur est corrigible. Il n'existe aucune redondance inutile, le code est le plus compact possible pour garantir la correction certaine d'une erreur. Pour de tels codes, la majoration de la borne de Hamming est une égalité. Ils sont dits <i>parfaits</i>. Ce qui donne lieu à la définition suivante :
</p>
<ul><li>Un <b>code de Hamming</b> est un code linéaire <i>parfait</i> de distance minimale égale à <i>trois</i>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Paramètres_du_code"><span id="Param.C3.A8tres_du_code"></span>Paramètres du code</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Détermination"><span id="D.C3.A9termination"></span>Détermination</h3></div>
<p>Un code est parfait, si et seulement si la borne de Hamming est atteinte. Cette propriété permet la détermination des paramètres possibles pour un code de Hamming. Notons <i>m</i> la valeur de <i>n</i> - <i>k</i>. On dispose alors des égalités :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 1+n\cdot (d-1)=d^{m}\quad {\text{donc}}\quad n={\frac {d^{m}-1}{d-1}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>1</mn>
<mo>+</mo>
<mi>n</mi>
<mo>⋅<!-- ⋅ --></mo>
<mo stretchy="false">(</mo>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mspace width="1em"></mspace>
<mrow class="MJX-TeXAtom-ORD">
<mtext>donc</mtext>
</mrow>
<mspace width="1em"></mspace>
<mi>n</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 1+n\cdot (d-1)=d^{m}\quad {\text{donc}}\quad n={\frac {d^{m}-1}{d-1}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/a98869290c22a967b132be5dcd04d9cf0a840e2d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.171ex; width:41.747ex; height:5.676ex;" alt="{\displaystyle 1+n\cdot (d-1)=d^{m}\quad {\text{donc}}\quad n={\frac {d^{m}-1}{d-1}}}" loading="lazy"></span></center>
<p>L'égalité <i>k</i> = <i>n</i> - <i>m</i> et le fait que la distance minimale d'un code de Hamming est égal à trois démontre la propriété suivante :
</p>
<ul><li><i>Pour tout code de Hamming sur un corps fini de cardinal </i>d<i>, il existe un entier </i>m<i> supérieur ou égal à deux, tel que les paramètres du code soient :</i></li></ul>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo>,</mo>
<mn>3</mn>
</mrow>
<mo>]</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/4c95631d959e2cb7db65e3ad383e4383c44bcf15.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:26.03ex; height:6.176ex;" alt="{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}" loading="lazy"></span></center>
<p>La propriété correspond à une condition nécessaire. Cependant, pour toute valeur de <i>d</i> et de <i>m</i>, la suite de l'article démontre qu'il existe un unique code de Hamming, à une équivalence près. La condition est donc aussi suffisante.
</p>
<div class="mw-heading mw-heading3"><h3 id="Polynôme_énumérateur_des_poids"><span id="Polyn.C3.B4me_.C3.A9num.C3.A9rateur_des_poids"></span>Polynôme énumérateur des poids</h3></div>
<p>Le polynôme énumérateur des poids <i>P</i>[<i>X</i>] est le polynôme dont le coefficient <i>p</i><sub>i</sub> du monôme <i>X</i><sup>i</sup> est égal au nombre de mots du code de poids de Hamming égal à <i>i</i>. L'identité de Mac Williams permet son calcul <i>(cf article détaillé)</i>. Il est égal à :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle P[X]={\frac {1}{d^{m}}}{\Bigg (}{\Big (}1+(d-1)X{\Big )}^{n}+(d^{m}-1){\Big (}1+(d-1)X{\Big )}^{n-d^{m-1}}(1-X)^{d^{m-1}}{\Bigg )}\;}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>P</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
</mfrac>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="2.470em" minsize="2.470em">(</mo>
</mrow>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="1.623em" minsize="1.623em">(</mo>
</mrow>
</mrow>
<mn>1</mn>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi>X</mi>
<msup>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="1.623em" minsize="1.623em">)</mo>
</mrow>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msup>
<mo>+</mo>
<mo stretchy="false">(</mo>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="1.623em" minsize="1.623em">(</mo>
</mrow>
</mrow>
<mn>1</mn>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mi>X</mi>
<msup>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="1.623em" minsize="1.623em">)</mo>
</mrow>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msup>
</mrow>
</msup>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>X</mi>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msup>
</mrow>
</msup>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mo maxsize="2.470em" minsize="2.470em">)</mo>
</mrow>
</mrow>
<mspace width="thickmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle P[X]={\frac {1}{d^{m}}}{\Bigg (}{\Big (}1+(d-1)X{\Big )}^{n}+(d^{m}-1){\Big (}1+(d-1)X{\Big )}^{n-d^{m-1}}(1-X)^{d^{m-1}}{\Bigg )}\;}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/16f8b7b6016140bca33b9e9c200fd8e1b0d5f871.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.171ex; width:78.836ex; height:7.509ex;" alt="{\displaystyle P[X]={\frac {1}{d^{m}}}{\Bigg (}{\Big (}1+(d-1)X{\Big )}^{n}+(d^{m}-1){\Big (}1+(d-1)X{\Big )}^{n-d^{m-1}}(1-X)^{d^{m-1}}{\Bigg )}\;}" loading="lazy"></span></center>
<div class="mw-heading mw-heading3"><h3 id="Exemple_:_code_de_répétition"><span id="Exemple_:_code_de_r.C3.A9p.C3.A9tition"></span>Exemple : code de répétition</h3></div>
<p>Le cas le plus simple est sans conteste celui où <i>d</i> est égal à <i>deux</i>, c’est-à-dire celui où le code est binaire et <i>m</i> est aussi égal à deux. On obtient un code de paramètre [3,1,3].
</p><p>Les messages sont constitués d'une lettre, par exemple <i>0</i>, les codes d'une triple répétition de la lettre soit <i>000</i> dans l'exemple. Comme l'alphabet ne contient que deux lettres, deux au moins sur trois des lettres d'un élément de <i>F</i> sont semblables, en conclusion tout mot de <i>F</i> est à distance de <i>un</i> d'un mot du code. De plus, un mot de <i>F</i> n'est à une distance d'au plus <i>un</i> que d'un unique mot du code, ce qui démontre que ce code est <i>parfait</i>.
</p><p>Cette propriété tombe si le code contient plus de deux lettres, en effet il existe des éléments de <i>F</i> constitués de trois lettres différentes et donc à distance de <i>deux</i> de trois mots différents du code et à distance de <i>un</i> d'aucun mot du code. On remarque aussi que la formule des paramètres, si <i>d</i> est différent de deux n'est plus vérifiée.
</p>
<div class="mw-heading mw-heading3"><h3 id="Exemple_:_le_cas_binaire_de_longueur_quatre">Exemple : le cas binaire de longueur quatre</h3></div>
<p>Les codes correcteurs réellement utilisés dans l'industrie sont plus complexes que les précédents. Le plus simple est celui de paramètres [7,4,3].
</p><p>C'est un code de dimension <i>sept</i>, c’est-à-dire que le récepteur reçoit <i>sept</i> <a href="Bit" title="Bit">bits</a>, de longueur <i>quatre</i> c’est-à-dire qu'une fois décodé, le message contient <i>quatre</i> lettres et la distance minimale entre chaque mot de code est <i>trois</i>.
</p><p>La figure de droite est une représentation graphique de ce code. Le message est le mot <i>d</i><sub>1</sub><i>d</i><sub>2</sub><i>d</i><sub>3</sub><i>d</i><sub>4</sub>. Le mot du code est constitué de trois <a href="Somme_de_contr%C3%B4le" title="Somme de contrôle">sommes de contrôles</a> <i>p</i><sub>1</sub><i>p</i><sub>2</sub><i>p</i><sub>3</sub>, puis des quatre lettres du mot du message. La valeur de <i>p</i><sub>i</sub> est égale à <i>zéro</i> si la somme des trois lettres du message incluses dans son cercle sur la figure est paire et <i>un</i> sinon.
</p><p>On remarque que la somme des éléments de chaque cercle est paire si et seulement si l'élément est un mot du code. De plus, chaque élément de <i>F</i> est à une distance de <i>un</i> d'un mot du code. En conséquence, ce code est parfait et possède une capacité maximale de correction d'<i>une</i> erreur.
</p><p>Cet exemple, le plus simple présentant une solution <i>non évidente</i>, présente une approche à même de démontrer l'existence et l'unicité d'une solution pour toutes les valeurs de <i>m</i> dans le cas d'un code binaire.
</p>
<div class="mw-heading mw-heading2"><h2 id="Approche_linéaire"><span id="Approche_lin.C3.A9aire"></span>Approche linéaire</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Matrice_de_parité"><span id="Matrice_de_parit.C3.A9"></span>Matrice de parité</h3></div>
<p>Il existe une application linéaire <a href="Surjection" title="Surjection">surjective</a> de <i>F</i> dans un espace de dimension <i>n</i> - <i>k</i> ayant pour noyau exactement le code :
</p>
<ul><li>Une <b>matrice de contrôle</b> d'un code φ(<i>E</i>) est une matrice <i>H</i> de dimension <i>n</i>x(<i>n</i> - <i>k</i>) tel que :</li></ul>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x\in \varphi (E)\Leftrightarrow H.^{t}x=0}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>x</mi>
<mo>∈<!-- ∈ --></mo>
<mi>φ<!-- φ --></mi>
<mo stretchy="false">(</mo>
<mi>E</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">⇔<!-- ⇔ --></mo>
<mi>H</mi>
<msup>
<mo>.</mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>t</mi>
</mrow>
</msup>
<mi>x</mi>
<mo>=</mo>
<mn>0</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x\in \varphi (E)\Leftrightarrow H.^{t}x=0}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/cda6fe6d8374352ba24df6e579bf13c3a2129db7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:22.404ex; height:3.009ex;" alt="{\displaystyle x\in \varphi (E)\Leftrightarrow H.^{t}x=0}" loading="lazy"></span></center>
<p>Cette application est essentielle à la fois sur le plan de l'implémentation, car elle permet une détection et une correction simple (cf <a href="D%C3%A9codage_par_syndrome" title="Décodage par syndrome">décodage par syndrome</a>) et sur celui de la construction d'un code.
</p><p>Il existe une relation directe entre la matrice de contrôle et la distance minimale du code :
</p>
<ul><li><i>La distance minimale δ d'un code linéaire est égale à la dimension du plus petit sous-espace vectoriel </i>S<i> de </i>F<i> généré par des éléments de la base canonique et tel que la restriction de la matrice de contrôle à </i>S<i> soit non <a href="Injection_(math%C3%A9matiques)" title="Injection (mathématiques)">injective</a>.</i></li></ul>
<p>La distance minimale est donc supérieure ou égale à trois si, et seulement si, deux <a href="Vecteur_colonne" title="Vecteur colonne">vecteurs colonnes</a> quelconques sont <a href="Famille_libre" class="mw-redirect" title="Famille libre">libres</a>. Cette propriété permet de résoudre le cas binaire pour toutes les valeurs de <i>m</i>.
</p><p>Remarque : <i>Pour le reste de l'article </i>H<i> désigne la matrice de parité.</i>
</p>
<div class="mw-heading mw-heading3"><h3 id="Exemple_:_cas_binaire_de_paramètres_[15,11,4]"><span id="Exemple_:_cas_binaire_de_param.C3.A8tres_.5B15.2C11.2C4.5D"></span>Exemple : cas binaire de paramètres [15,11,4]</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Matrice_de_contrôle"><span id="Matrice_de_contr.C3.B4le"></span>Matrice de contrôle</h4></div>
<p>Dans le cas binaire avec pour valeur de <i>m</i> <i>quatre</i>, la matrice de contrôle est de dimension 15x4, c’est-à-dire qu'elle contient quinze colonnes et quatre lignes. Pour obtenir une distance minimale au moins égale à trois, chaque colonne doit être différente. En effet, une colonne correspond au syndrome d'un vecteur de la <a href="Base_canonique" title="Base canonique">base canonique</a> de <i>F</i>, c’est-à-dire à un message de <a href="Distance_de_Hamming" title="Distance de Hamming">poids</a> <i>un</i>. Si deux colonnes sont semblables, alors le message <i>m</i>, de poids deux dont les coordonnées valent <i>zéro</i> partout sauf pour les deux colonnes égales où les coordonnées valent <i>un</i>, vérifie <i>H</i><sup>t</sup><i>m</i> = 0. En effet, dans un corps binaire 1 + 1 est égal à 0. Il existerait alors un mot du code de poids <i>deux</i>, en conséquence la distance minimale ne peut être égale à <i>trois</i>. De même, aucun vecteur colonne ne peut être nul, sinon, un vecteur de la base canonique de poids <i>un</i> serait élément du code.
</p><p>Or, il n'existe que <i>quinze</i> vecteurs dans l'ensemble d'arrivée de la matrice de contrôle. À l'ordre près, il n'existe donc qu'une unique matrice de contrôle possible pour ce cas, correspondant à la suite des nombres de <i>un</i> à quinze en binaire. Si <i>H</i> est choisi de telle manière à représenter un code systématique alors on obtient :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\quad 1\quad 0\quad 0\quad 0\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\quad 0\quad 1\quad 0\quad 0\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\quad 0\quad 0\quad 1\quad 0\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\quad 0\quad 0\quad 0\quad 1\end{pmatrix}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>H</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>(</mo>
<mtable rowspacing="4pt" columnspacing="1em">
<mtr>
<mtd>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
</mtd>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
</mtr>
</mtable>
<mo>)</mo>
</mrow>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\quad 1\quad 0\quad 0\quad 0\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\quad 0\quad 1\quad 0\quad 0\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\quad 0\quad 0\quad 1\quad 0\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\quad 0\quad 0\quad 0\quad 1\end{pmatrix}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/6244298b1c436c310ad2112339099d2284b293ef.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -5.671ex; width:59.933ex; height:12.509ex;" alt="{\displaystyle H={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\quad 1\quad 0\quad 0\quad 0\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\quad 0\quad 1\quad 0\quad 0\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\quad 0\quad 0\quad 1\quad 0\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\quad 0\quad 0\quad 0\quad 1\end{pmatrix}}}" loading="lazy"></span></center>
<p>L'analyse précédente montre qu'il est nécessaire qu'une matrice de contrôle d'un code de distance minimale égale à trois ait cette forme. Réciproquement cette forme est suffisante pour garantir que la distance minimale soit effectivement égale à trois. En effet, aucun message de poids <i>un</i> n'est élément du code (un message de poids <i>un</i> est un élément de la base canonique) car leurs images par <i>H</i> est un vecteur non nul. Et aucun message de poids <i>deux</i> (un message de poids <i>deux</i> est la somme de deux éléments de la base canonique) n'est élément du code. En effet, ils auraient même image par <i>H</i> car deux vecteurs sont colinéaires si et seulement s'ils sont égaux dans le cas d'un corps binaire, or les vecteurs colonnes sont tous différents.
</p>
<div class="mw-heading mw-heading4"><h4 id="Matrice_génératrice"><span id="Matrice_g.C3.A9n.C3.A9ratrice"></span>Matrice génératrice</h4></div>
<p>La matrice de contrôle définit totalement la géométrie du code, il suffit donc, pour terminer l'implémentation de trouver une matrice génératrice <i>G</i> de <i>E</i> dans <i>F</i>. L'application linéaire associée doit vérifier deux conditions : elle est <a href="Injection_(math%C3%A9matiques)" title="Injection (mathématiques)">injective</a>, et son image est le <a href="Noyau_(alg%C3%A8bre)" title="Noyau (algèbre)">noyau</a> de <i>H</i>. Il suffit donc de trouver une matrice de rang 11 tel que <i>H</i>.<i>G</i> = 0 La construction de la matrice <i>G</i> est simplifiée dans le cas où <i>H</i> représente un code systématique, si <i>Id</i><sub>q</sub> la <a href="Matrice_identit%C3%A9" title="Matrice identité">matrice identité</a> d'ordre <i>q</i> :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G={Id_{k} \choose C}\quad \quad H=(-C\;Id_{n-k})\Rightarrow H.G=(-C\;Id_{n-k})\,{Id_{k} \choose C}=0_{n-kk}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mrow class="MJX-TeXAtom-OPEN">
<mo maxsize="2.047em" minsize="2.047em">(</mo>
</mrow>
<mfrac linethickness="0">
<mrow>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
</mrow>
<mi>C</mi>
</mfrac>
<mrow class="MJX-TeXAtom-CLOSE">
<mo maxsize="2.047em" minsize="2.047em">)</mo>
</mrow>
</mrow>
</mrow>
<mspace width="1em"></mspace>
<mspace width="1em"></mspace>
<mi>H</mi>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mo>−<!-- − --></mo>
<mi>C</mi>
<mspace width="thickmathspace"></mspace>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo stretchy="false">⇒<!-- ⇒ --></mo>
<mi>H</mi>
<mo>.</mo>
<mi>G</mi>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mo>−<!-- − --></mo>
<mi>C</mi>
<mspace width="thickmathspace"></mspace>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mrow class="MJX-TeXAtom-OPEN">
<mo maxsize="2.047em" minsize="2.047em">(</mo>
</mrow>
<mfrac linethickness="0">
<mrow>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
</mrow>
<mi>C</mi>
</mfrac>
<mrow class="MJX-TeXAtom-CLOSE">
<mo maxsize="2.047em" minsize="2.047em">)</mo>
</mrow>
</mrow>
</mrow>
<mo>=</mo>
<msub>
<mn>0</mn>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
<mi>k</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G={Id_{k} \choose C}\quad \quad H=(-C\;Id_{n-k})\Rightarrow H.G=(-C\;Id_{n-k})\,{Id_{k} \choose C}=0_{n-kk}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/efe82be911453f83688f7911b92269fcaba47d73.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:72.534ex; height:6.176ex;" alt="{\displaystyle G={Id_{k} \choose C}\quad \quad H=(-C\;Id_{n-k})\Rightarrow H.G=(-C\;Id_{n-k})\,{Id_{k} \choose C}=0_{n-kk}}" loading="lazy"></span></center>
<p>En remarquant que dans un corps binaire les opérations + et - sont les mêmes, on obtient :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G={Id_{11} \choose C}\quad avec\quad C={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\end{pmatrix}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mrow class="MJX-TeXAtom-OPEN">
<mo maxsize="2.047em" minsize="2.047em">(</mo>
</mrow>
<mfrac linethickness="0">
<mrow>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>11</mn>
</mrow>
</msub>
</mrow>
<mi>C</mi>
</mfrac>
<mrow class="MJX-TeXAtom-CLOSE">
<mo maxsize="2.047em" minsize="2.047em">)</mo>
</mrow>
</mrow>
</mrow>
<mspace width="1em"></mspace>
<mi>a</mi>
<mi>v</mi>
<mi>e</mi>
<mi>c</mi>
<mspace width="1em"></mspace>
<mi>C</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>(</mo>
<mtable rowspacing="4pt" columnspacing="1em">
<mtr>
<mtd>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
</mtd>
<mtd>
<mn>1</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
<mspace width="1em"></mspace>
<mn>1</mn>
<mspace width="1em"></mspace>
<mn>0</mn>
</mtd>
<mtd>
<mn>1</mn>
</mtd>
</mtr>
</mtable>
<mo>)</mo>
</mrow>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G={Id_{11} \choose C}\quad avec\quad C={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\end{pmatrix}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/1017a507080e16fb91377af9ac4ae14a2a0eae02.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -5.671ex; width:67.392ex; height:12.509ex;" alt="{\displaystyle G={Id_{11} \choose C}\quad avec\quad C={\begin{pmatrix}0\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1\quad 1\quad 1\quad 1&1\\0\quad 1\quad 1\quad 1\quad 0\quad 0\quad 0\quad 1\quad 1\quad 1&1\\1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 0\quad 1&1\\1\quad 1\quad 0\quad 1\quad 1\quad 0\quad 1\quad 0\quad 1\quad 0&1\end{pmatrix}}}" loading="lazy"></span></center>
<p>Le code est donc composé du message et de quatre <a href="Somme_de_contr%C3%B4le" title="Somme de contrôle">sommes de contrôle</a> permettant de corriger exactement une erreur.
</p>
<div class="mw-heading mw-heading3"><h3 id="Cas_binaire">Cas binaire</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Théorème_d'existence"><span id="Th.C3.A9or.C3.A8me_d.27existence"></span>Théorème d'existence</h4></div>
<p>La méthode précédente se généralise pour tous les codes de Hamming binaires. Les paramètres du code recherchés sont maintenant [2<sup>m</sup> - 1, 2<sup>m</sup> - <i>m</i> - 1, 3]. On peut citer comme exemple d'utilisation de code de cette nature, celui du <a href="Minitel" title="Minitel">minitel</a><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> qui a choisi la valeur <i>sept</i> pour <i>m</i>. Ainsi, pour un message de longueur cent vingt, <i>sept</i> sommes de contrôle permettent de corriger toute erreur sur un unique bit.
</p><p>La matrice de contrôle est de dimension <i>m</i>x2<sup>m</sup> - 1. Une <a href="%C3%89quivalence_logique" title="Équivalence logique">condition nécessaire et suffisante</a> pour que la distance minimale associée soit égale à trois est que tous les vecteurs soit libres deux à deux. C'est le cas s'ils sont non nuls et tous différents. Un espace vectoriel binaire de dimension <i>m</i> contient exactement 2<sup>m</sup> - 1 vecteurs non nuls différents. À l'ordre près, il n'existe donc qu'une unique matrice de contrôle associée à une distance minimale égale à trois.
</p><p>Il est toujours possible de réordonner la matrice de contrôle pour lui donner la forme d'un code systématique. Cette forme permet simplement de calculer la matrice génératrice systématique associée.
</p>
<ul><li><i>Si </i>m<i> est un entier supérieur ou égal à deux, il existe un seul code binaire, de paramètres [2<sup>m</sup> - 1, 2<sup>m</sup> - </i>m<i> - 1, 3], à une équivalence près. Ces codes forment l'ensemble des codes binaires de Hamming, ils sont parfaits.</i></li></ul>
<div class="mw-heading mw-heading4"><h4 id="Code_de_Hamming_généralisé_(dit_également_'étendu')"><span id="Code_de_Hamming_g.C3.A9n.C3.A9ralis.C3.A9_.28dit_.C3.A9galement_.27.C3.A9tendu.27.29"></span>Code de Hamming généralisé (dit également 'étendu')</h4></div>
<p>Deux raisons poussent à généraliser le code. Une dimension égale à 2<sup>m</sup> - 1 n'est pas idéale, en terme industriel. Il est en effet plus commode d'utiliser une dimension de la forme 2<sup>m</sup>. De plus un tel code corrige une erreur, mais si deux erreurs se produisent, non seulement le code ne le détecte pas, mais en plus il en ajoute une troisième.
</p><p>Ces deux raisons amènent en général à ajouter une dernière somme de contrôle validant la parité des 2<sup>m</sup> - 1 premières lettres du code. Une deuxième erreur est alors détectée, même si elle ne peut être corrigée sans nouvelle transmission.
</p>
<ul><li>Le <b>code de Hamming généralisé (dit également 'étendu')</b>, de paramètre [2<sup>m</sup>, 2<sup>m</sup> - <i>m</i> - 1, 4] correspond à un code de Hamming classique [2<sup>m</sup> - 1, 2<sup>m</sup> - <i>m</i> - 1, 3] auquel a été ajouté un bit de parité portant sur les 2<sup>m</sup> -1 lettres du mot du code.<b></b></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Corps_fini_quelconque">Corps fini quelconque</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Corps_fini">Corps fini</h4></div>
<p>L'utilisation d'autres corps que binaires n'est pas une préoccupation uniquement théorique. Ils sont utilisés pour corriger des effacements qui peuvent être importants. Ils sont utilisés par exemple pour la lecture des <a href="Disque_compact" title="Disque compact">disques compacts</a> pouvant corriger jusqu'à 4096 effacements consécutifs<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>.
</p><p>Tous les corps finis possèdent un cardinal de la forme <i>p</i><sup>q</sup> où <i>p</i> est un nombre premier. L'industrie utilise souvent la valeur <i>p</i> égale à deux. Le code est encore transmis sous forme de bits, la table d'addition reste inchangée, en revanche la multiplication n'est plus la même. On obtient, par exemple pour le corps <i>F</i><sub>8</sub> à huit éléments la table suivante :
</p>
<center>
<table class="wikitable">
<tbody><tr>
<td>
<table border="1">
<tbody><tr>
<td><b>+</b></td>
<td><b>000</b></td>
<td><b>001</b></td>
<td><b>010</b></td>
<td><b>011</b></td>
<td><b>100</b></td>
<td><b>101</b></td>
<td><b>110</b></td>
<td><b>111</b>
</td></tr>
<tr>
<td><b>000</b></td>
<td>000</td>
<td>001</td>
<td>010</td>
<td>011</td>
<td>100</td>
<td>101</td>
<td>110</td>
<td>111
</td></tr>
<tr>
<td><b>001</b></td>
<td>001</td>
<td>000</td>
<td>011</td>
<td>010</td>
<td>101</td>
<td>100</td>
<td>111</td>
<td>110
</td></tr>
<tr>
<td><b>010</b></td>
<td>010</td>
<td>011</td>
<td>000</td>
<td>001</td>
<td>110</td>
<td>111</td>
<td>100</td>
<td>101
</td></tr>
<tr>
<td><b>011</b></td>
<td>011</td>
<td>010</td>
<td>001</td>
<td>000</td>
<td>111</td>
<td>110</td>
<td>101</td>
<td>100
</td></tr>
<tr>
<td><b>100</b></td>
<td>100</td>
<td>101</td>
<td>110</td>
<td>111</td>
<td>000</td>
<td>001</td>
<td>010</td>
<td>011
</td></tr>
<tr>
<td><b>101</b></td>
<td>101</td>
<td>100</td>
<td>111</td>
<td>110</td>
<td>001</td>
<td>000</td>
<td>011</td>
<td>010
</td></tr>
<tr>
<td><b>110</b></td>
<td>110</td>
<td>111</td>
<td>100</td>
<td>101</td>
<td>010</td>
<td>011</td>
<td>000</td>
<td>001
</td></tr>
<tr>
<td><b>111</b></td>
<td>111</td>
<td>110</td>
<td>101</td>
<td>100</td>
<td>011</td>
<td>010</td>
<td>001</td>
<td>000
</td></tr></tbody></table>
</td>
<td>
<table border="1">
<tbody><tr>
<td><b>.</b></td>
<td><b>000</b></td>
<td><b>001</b></td>
<td><b>010</b></td>
<td><b>011</b></td>
<td><b>100</b></td>
<td><b>101</b></td>
<td><b>110</b></td>
<td><b>111</b>
</td></tr>
<tr>
<td><b>000</b></td>
<td>000</td>
<td>000</td>
<td>000</td>
<td>000</td>
<td>000</td>
<td>000</td>
<td>000</td>
<td>000
</td></tr>
<tr>
<td><b>001</b></td>
<td>000</td>
<td>001</td>
<td>010</td>
<td>011</td>
<td>100</td>
<td>101</td>
<td>110</td>
<td>111
</td></tr>
<tr>
<td><b>010</b></td>
<td>000</td>
<td>010</td>
<td>100</td>
<td>110</td>
<td>011</td>
<td>001</td>
<td>111</td>
<td>101
</td></tr>
<tr>
<td><b>011</b></td>
<td>000</td>
<td>011</td>
<td>110</td>
<td>101</td>
<td>111</td>
<td>100</td>
<td>001</td>
<td>010
</td></tr>
<tr>
<td><b>100</b></td>
<td>000</td>
<td>100</td>
<td>011</td>
<td>111</td>
<td>110</td>
<td>010</td>
<td>101</td>
<td>001
</td></tr>
<tr>
<td><b>101</b></td>
<td>000</td>
<td>101</td>
<td>001</td>
<td>100</td>
<td>010</td>
<td>111</td>
<td>011</td>
<td>110
</td></tr>
<tr>
<td><b>110</b></td>
<td>000</td>
<td>110</td>
<td>111</td>
<td>001</td>
<td>101</td>
<td>011</td>
<td>010</td>
<td>100
</td></tr>
<tr>
<td><b>111</b></td>
<td>000</td>
<td>111</td>
<td>101</td>
<td>010</td>
<td>001</td>
<td>110</td>
<td>100</td>
<td>011
</td></tr></tbody></table>
</td></tr></tbody></table>
</center>
<p>Si la logique linéaire reste la même, en revanche, la modification de la table de multiplication engendre une complexité supplémentaire à l'encodage et au décodage. Le terme précis n'est plus somme de contrôle mais de <a href="Contr%C3%B4le_de_redondance_cyclique" title="Contrôle de redondance cyclique">contrôle de redondance cyclique</a> ou encore CRC.
</p>
<div class="mw-heading mw-heading4"><h4 id="Exemple:_le_cas_de_paramètres_[9,_7,_3]"><span id="Exemple:_le_cas_de_param.C3.A8tres_.5B9.2C_7.2C_3.5D"></span>Exemple: le cas de paramètres [9, 7, 3]</h4></div>
<p>Étudions sur <i>F</i><sub>8</sub> le cas où <i>m</i> est égal à <i>deux</i>. Il correspond aux paramètres [9, 7, 3]. La matrice de contrôle est de dimension 2x9. Le théorème sur la relation entre la distance minimale et la matrice de contrôle montre que pour bâtir ce code, il suffit de trouver <i>neuf</i> vecteurs dans un espace de dimension <i>deux</i>, libres deux à deux. La logique précédente ne s'applique plus, deux vecteurs distincts peuvent être colinéaires, par exemple:
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (001,011)=011.(010,001)\;}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mn>001</mn>
<mo>,</mo>
<mn>011</mn>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>011.</mn>
<mo stretchy="false">(</mo>
<mn>010</mn>
<mo>,</mo>
<mn>001</mn>
<mo stretchy="false">)</mo>
<mspace width="thickmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (001,011)=011.(010,001)\;}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/7e593484a9cd466a467a5f50d77a576a4521e067.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:27.514ex; height:2.843ex;" alt="{\displaystyle (001,011)=011.(010,001)\;}" loading="lazy"></span></center>
<p>Une matrice de dimension 2x9 est associée à une distance minimale égale à trois si et seulement si chaque vecteur colonne est choisi dans une <a href="Relation_d'%C3%A9quivalence" title="Relation d'équivalence">classe</a> de l'<a href="Espace_projectif" title="Espace projectif">espace projectif</a> de <i>F</i><sub>8</sub><sup>2</sup> différente. Chaque classe d'équivalence de l'espace projectif contient <i>sept</i> éléments (le cardinal du corps moins <i>un</i>), et l'espace projectif est une partition de l'espace des syndromes sans le vecteur nul, c’est-à-dire un ensemble de cardinal soixante trois. Il existe exactement neuf éléments dans l'espace projectif, exactement le nombre de colonnes dans la matrice de contrôle. La matrice de contrôle est donc encore unique, à l'ordre près et à une <a href="Homoth%C3%A9tie" title="Homothétie">homothétie</a> près pour chaque vecteur colonne. On peut choisir par exemple :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H={\begin{pmatrix}001&010&100&011&110&101&111&001&000\\001&001&001&001&001&001&001&000&001\end{pmatrix}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>H</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>(</mo>
<mtable rowspacing="4pt" columnspacing="1em">
<mtr>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>010</mn>
</mtd>
<mtd>
<mn>100</mn>
</mtd>
<mtd>
<mn>011</mn>
</mtd>
<mtd>
<mn>110</mn>
</mtd>
<mtd>
<mn>101</mn>
</mtd>
<mtd>
<mn>111</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>000</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>000</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
</mtable>
<mo>)</mo>
</mrow>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle H={\begin{pmatrix}001&010&100&011&110&101&111&001&000\\001&001&001&001&001&001&001&000&001\end{pmatrix}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/e05aac26404d6c3483a5e6e019f401552acdf5c4.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:59.302ex; height:6.176ex;" alt="{\displaystyle H={\begin{pmatrix}001&010&100&011&110&101&111&001&000\\001&001&001&001&001&001&001&000&001\end{pmatrix}}}" loading="lazy"></span></center>
<p>La même logique que précédemment permet de déterminer la matrice génératrice :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G={\begin{pmatrix}Id_{7}&C\end{pmatrix}}\quad avec\quad C={\begin{pmatrix}001&001\\010&001\\100&001\\011&001\\110&001\\101&001\\111&001\end{pmatrix}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>(</mo>
<mtable rowspacing="4pt" columnspacing="1em">
<mtr>
<mtd>
<mi>I</mi>
<msub>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>7</mn>
</mrow>
</msub>
</mtd>
<mtd>
<mi>C</mi>
</mtd>
</mtr>
</mtable>
<mo>)</mo>
</mrow>
</mrow>
<mspace width="1em"></mspace>
<mi>a</mi>
<mi>v</mi>
<mi>e</mi>
<mi>c</mi>
<mspace width="1em"></mspace>
<mi>C</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>(</mo>
<mtable rowspacing="4pt" columnspacing="1em">
<mtr>
<mtd>
<mn>001</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>010</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>100</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>011</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>110</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>101</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>111</mn>
</mtd>
<mtd>
<mn>001</mn>
</mtd>
</mtr>
</mtable>
<mo>)</mo>
</mrow>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G={\begin{pmatrix}Id_{7}&C\end{pmatrix}}\quad avec\quad C={\begin{pmatrix}001&001\\010&001\\100&001\\011&001\\110&001\\101&001\\111&001\end{pmatrix}}}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/0848523ed94accbea94cac53dfa67a66a3dd9cda.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -10.671ex; width:43.083ex; height:22.343ex;" alt="{\displaystyle G={\begin{pmatrix}Id_{7}&C\end{pmatrix}}\quad avec\quad C={\begin{pmatrix}001&001\\010&001\\100&001\\011&001\\110&001\\101&001\\111&001\end{pmatrix}}}" loading="lazy"></span></center>
<p>Le code est donc composé du message et deux contrôles de redondance cyclique permettant de corriger exactement une erreur.
</p><p>Si l'on compte en termes de bit, trois bits sont nécessaires pour coder une lettre. Le code est donc dune longueur 27 bits avec 6 bits de CRC. Si on le compare au code de Hamming binaire de longueur 26 avec 5 bits de parité, le gain n'est pas clair. En pratique, l'utilisation de corps plus vastes est surtout l'objet de codes offrant des redondances beaucoup plus importantes comme ceux de <a href="Code_de_Reed-Solomon" title="Code de Reed-Solomon">Reed-Solomon</a>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Existence_et_unicité_dans_le_cas_général"><span id="Existence_et_unicit.C3.A9_dans_le_cas_g.C3.A9n.C3.A9ral"></span>Existence et unicité dans le cas général</h4></div>
<p>Le cas général est proche de l'exemple précédent. L'existence et l'unicité d'un code de Hamming sur un corps de cardinal <i>d</i> et pour la valeur <i>m</i> dépend du cardinal de l'espace projectif d'un espace vectoriel sur le corps <i>F</i><sub>d</sub>. L'espace vectoriel <i>S</i> des syndromes est de dimension <i>m</i>. Il contient <i>d</i><sup>m</sup> - 1 vecteurs non nuls, le corps contient <i>d</i> - 1 éléments non nuls, l'espace projectif de <i>S</i> est donc de cardinal <i>d</i><sup>m</sup> - 1/<i>d</i> - 1. C'est exactement la dimension de <i>F</i>, l'espace des codes. À un ordre près et à une homothétie près sur chaque vecteur de la base canonique de <i>F</i>, il n'existe donc qu'une unique matrice de contrôle. En conclusion :
</p>
<ul><li><i>Si </i>d<i> est une puissance d'un nombre premier et </i>m<i> un entier supérieur à </i>deux<i>, à une équivalence près, il existe un et un seul code de Hamming de paramètres :</i></li></ul>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>[</mo>
<mrow>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>,</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<msup>
<mi>d</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
<mrow>
<mi>d</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo>,</mo>
<mn>3</mn>
</mrow>
<mo>]</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/4c95631d959e2cb7db65e3ad383e4383c44bcf15.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:26.03ex; height:6.176ex;" alt="{\displaystyle \left[{\frac {d^{m}-1}{d-1}},{\frac {d^{m}-1}{d-1}}-m,3\right]}" loading="lazy"></span></center>
<p>Sa construction est analogue à celle utilisée pour l'exemple précédent.
</p>
<div class="mw-heading mw-heading2"><h2 id="Code_cyclique">Code cyclique</h2></div>
<p>Il est possible d'enrichir la <a href="Alg%C3%A8bre" title="Algèbre">structure algébrique</a> de <i>F</i> d'une structure d'<a href="Anneau_unitaire" title="Anneau unitaire">anneau</a>. Cet enrichissement a pour objectif de construire des codes ayant de bonnes propriétés d'optimalité. Les codes <a href="Code_BCH" title="Code BCH">BCH</a> ainsi que ceux de Reed-Solomon sont les exemples principaux. Dans le cas binaire, un code de Hamming apparait comme un code cyclique de type BCH.
</p><p>Pour comprendre cette structure d'anneau, une première remarque est nécessaire. L'<a href="Extension_finie" title="Extension finie">extension</a> de <i>F</i><sub>2</sub> de cardinal 2<sup>m</sup> possède comme groupe multiplicatif un <a href="Groupe_cyclique" title="Groupe cyclique">groupe cyclique</a> d'ordre 2<sup>m</sup> - 1, on retrouve ici la dimension <i>n</i> d'un code binaire de Hamming. Tout élément de l'extension est donc racine du <a href="Polyn%C3%B4me" title="Polynôme">polynôme</a> <i>P</i>[<i>X</i>] = <i>X</i><sup>n</sup> - 1. Un polynôme à coefficients dans <i>F</i><sub>2</sub>, <i>K</i>[<i>X</i>] définit une fonction sur l'extension de cardinal 2<sup>m</sup>. Il existe un et un seul polynôme <i>R</i>[<i>X</i>] de degré strictement inférieur à <i>n</i> et ayant les mêmes valeurs sur cette extension que <i>K</i>[<i>X</i>]. En effet, la division euclidienne donne l'égalité suivante si <i>d</i> <i>R</i>[<i>X</i>] désigne le degré du polynôme <i>R</i>[<i>X</i>] :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle K[X]=Q[X].P[X]+R[X]\quad avec\quad d\,R[X]<n\;}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>K</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mi>Q</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mo>.</mo>
<mi>P</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mo>+</mo>
<mi>R</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mspace width="1em"></mspace>
<mi>a</mi>
<mi>v</mi>
<mi>e</mi>
<mi>c</mi>
<mspace width="1em"></mspace>
<mi>d</mi>
<mspace width="thinmathspace"></mspace>
<mi>R</mi>
<mo stretchy="false">[</mo>
<mi>X</mi>
<mo stretchy="false">]</mo>
<mo><</mo>
<mi>n</mi>
<mspace width="thickmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle K[X]=Q[X].P[X]+R[X]\quad avec\quad d\,R[X]<n\;}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/73a49e620d30b4a68a48510263a8ec5dca9fa85b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:48.353ex; height:2.843ex;" alt="{\displaystyle K[X]=Q[X].P[X]+R[X]\quad avec\quad d\,R[X]<n\;}" loading="lazy"></span></center>
<p>La structure d'anneau choisie est alors celle du quotient <i>F</i><sub>d</sub>/<i>P</i>[<i>X</i>]. Les codes associés sont les <a href="Id%C3%A9al" title="Idéal">idéaux</a> de cet anneau.
</p>
<ul><li>Soit <i>m</i> un entier strictement positif et <i>n</i> un entier défini par <i>n</i> = 2<sup>m</sup> - 1. Un code linéaire sur <i>F</i><sub>d</sub> est dit <b>cyclique</b> si l'espace vectoriel est muni de la structure d'anneau <i>F</i><sub>d</sub>/<i>P</i>[<i>X</i>], avec <i>P</i>[<i>X</i>] = <i>X</i><sup>n</sup> - 1 et que le code est un idéal de <i>F</i>.</li></ul>
<p>Dire que le code est un idéal revient à dire qu'il est cyclique, c’est-à-dire qu'il vérifie la propriété suivante :
</p>
<center><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \forall (x_{n-1},x_{n-2},\cdots ,x_{1},x_{0})\in C\quad (x_{n-2},x_{n-3},\cdots ,x_{0},x_{n-1})\in C}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi mathvariant="normal">∀<!-- ∀ --></mi>
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>∈<!-- ∈ --></mo>
<mi>C</mi>
<mspace width="1em"></mspace>
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>2</mn>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>3</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>∈<!-- ∈ --></mo>
<mi>C</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \forall (x_{n-1},x_{n-2},\cdots ,x_{1},x_{0})\in C\quad (x_{n-2},x_{n-3},\cdots ,x_{0},x_{n-1})\in C}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/b199af235a7268629ae585ce04dbc725cba10d53.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:61.335ex; height:2.843ex;" alt="{\displaystyle \forall (x_{n-1},x_{n-2},\cdots ,x_{1},x_{0})\in C\quad (x_{n-2},x_{n-3},\cdots ,x_{0},x_{n-1})\in C}" loading="lazy"></span></center>
<p>Soit Φ<sub>n</sub>[X] un polynôme cyclotomique d'ordre <i>n</i> la dimension du code, et à coefficient dans <i>F</i><sub>2</sub>. C'est un polynôme de degré <i>m</i> (cf l'article <a href="Polyn%C3%B4me_cyclotomique" title="Polynôme cyclotomique">Polynôme cyclotomique</a>), de plus :
</p>
<ul><li><i>L'idéal </i>C<i> engendré par Φ<sub>n</sub>[X] est un code cyclique de longueur </i>k<i> = </i>n<i> - </i>m<i>.</i></li></ul>
<p>Il possède la <i>bonne</i> distance minimale :
</p>
<ul><li><i>L'idéal </i>C<i> engendré par Φ<sub>n</sub>[X] possède une distance minimale égale à </i>trois<i>.</i></li></ul>
<p>Ce code cyclique est donc un code binaire de Hamming et tout code binaire de Hamming admet une représentation cyclique.
</p><p>Les démonstrations se trouvent dans l'article associé.
</p>
<div class="mw-heading mw-heading2"><h2 id="Notes_et_références"><span id="Notes_et_r.C3.A9f.C3.A9rences"></span>Notes et références</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><a rel="nofollow" class="external text" href="http://itswww.epfl.ch/~courssisy/slides2004/040525%20-%20codes%20lineaires.pdf">Présentation du code de Hamming par l'Ecole Polytechnique fédérale de Lausanne</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text"><a href="Claude_Shannon" title="Claude Shannon">Claude Shannon</a> <i>A mathematical theory of communication</i> <a href="Bell_System_Technical_Journal" title="Bell System Technical Journal">Bell System Technical Journal</a>, vol. 27, pp. 379-423 et 623-656, Juil et Oct 1948</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><a href="Richard_Hamming" title="Richard Hamming">Richard Hamming</a> <i>Error-detecting and error-correcting codes</i> Bell Syst. Tech. J. 29 pp 147 à 160 1950</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text">R. C. Bose and D. K. Ray-Chaudhuri <i>On a class of error-. correcting. binary group codes</i> Inform. Control, vol. 3, pp. 68-79, Mars 1960</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text">A. Hocquenghem <i>Codes correcteurs d'erreurs</i> Chiffre 1959</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text">P. Arnoult <i>Minitel, codage de l'information et corps finis</i> Pour la science N°125 Mars 1988</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text">J.P. Zanotti <i>Codage d'un signal audionumérique sur un support à lecture optique, erreurs au décodage et codes M.S.D</i> Mémoire de D.E.A. Université d'Aix Marseille, 1992</span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Bibliographie">Bibliographie</h3></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a href="Jessie_MacWilliams" title="Jessie MacWilliams">Jessie MacWilliams</a> et <a href="Neil_Sloane" title="Neil Sloane">Neil Sloane</a>, <i>The Theory of Error-Correcting Codes,</i> <a href="Elsevier_(%C3%A9diteur)" class="mw-redirect" title="Elsevier (éditeur)">North-Holland</a>, 1977, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a> <span class="nowrap">9780444850096</span>)</small></li>
<li>A. Spătaru, <i>Fondements de la théorie de la transmission de l'information,</i> - <small>(éd. <a href="PPUR" class="mw-redirect" title="PPUR">PPUR</a>, 1987) </small>- <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a> <span class="nowrap">9782880741334</span>)</small></li>
<li><span class="ouvrage" id="Demazure"><span class="ouvrage" id="Michel_Demazure"><a href="Michel_Demazure" title="Michel Demazure">Michel <span class="nom_auteur">Demazure</span></a>, <cite class="italique">Cours d'algèbre : primalité, divisibilité, codes</cite> <small>[détail des éditions]</small><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Cours+d%27alg%C3%A8bre&rft.stitle=primalit%C3%A9%2C+divisibilit%C3%A9%2C+codes&rft.aulast=Demazure&rft.aufirst=Michel&rfr_id=info%3Asid%2Ffr.wikipedia.org%3ACode+de+Hamming"></span></span></span></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Liens_externes">Liens externes</h3></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.math.u-bordeaux.fr/~zemor/codes06.pdf">Code Linéaire</a> par G. Zemor, <a href="Universit%C3%A9_Bordeaux_I" class="mw-redirect" title="Université Bordeaux I">université Bordeaux I</a></li></ul>
<div class="navbox-container" style="clear:both;">
</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail des télécommunications</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer skin-invert-image" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l'informatique théorique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2024-11-18" href="https://fr.wikipedia.org/wiki/?title=Code_de_Hamming&oldid=220396107">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>